package twoPointer;

/**
 * @author pengfei.hpf
 * @date 2020/3/11
 * @verdion 1.0.0
 * 42. 接雨水
 * 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。
 *
 *
 *
 * 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图，在这种情况下，可以接 6 个单位的雨水（蓝色部分表示雨水）。 感谢 Marcos 贡献此图。
 *
 * 示例:
 *
 * 输入: [0,1,0,2,1,0,1,3,2,1,2,1]
 * 输出: 6
 */
public class TrappingRainWater {

    public int trap(int[] height) {
        if(height == null || height.length == 0){
            return 0;
        }
        int volume = 0;
        int n  = height.length;
        int[] leftMax = new int[n];
        int[] rightMax = new int[n];
        leftMax[0] = height[0];
        rightMax[n-1] = height[n - 1];
        for(int i = 1; i < n; i ++){
            leftMax[i] = Math.max(leftMax[i-1], height[i]);
        }
        for(int i = n-2; i >=0; i --){
            rightMax[i] = Math.max(rightMax[i + 1], height[i]);
        }
        for(int i = 1; i < n - 1; i ++){
            volume += Math.min(leftMax[i], rightMax[i]) - height[i];
        }
        return volume;
    }

    //双指针法,反而慢了?
    public int trapII(int[] height) {
        if(height == null || height.length <= 2){
            return 0;
        }
        int volume = 0;
        int n = height.length;
        int left = 1;
        int right = n - 2;
        int leftMax = height[0];
        int rightMax = height[n - 1];
        while(left <= right){
            leftMax = Math.max(leftMax, height[left]);
            rightMax = Math.max(rightMax, height[right]);
            if(leftMax <= rightMax){
                volume += leftMax - height[left];
                left ++;
            } else {
                volume += rightMax - height[right];
                right --;
            }
        }

        return volume;
    }
}
